import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

/**
 * 今日课堂代码
 */


//关于抽象类
//abstract修饰的方法是抽象方法
//存在抽象方法的类必须加上abstract,是抽象类
public class Test {

    public static void main(String[] args) {

    }

}


 class Test3 {


    //main方法必须用static修饰
    //时刻需要注意，main方法方法是静态方法，不能调用非静态的方法
    public static void main(String[] args) {

        System.out.println("B2 b = new B2()::");
        B2 b = new B2();
        System.out.println("=======");
        System.out.println("A a = new B2()::");
        A a = new B2();
        System.out.println("=======");
        System.out.println("Shape2 shape = new B2()::");
        Shape2 shape = new B2();
        //↑父类的父类，仍然可以发生向上转型

        //几种不同的调用方法
        b.draw();
        a.draw();
        shape.draw();




        drawMap(a);
        drawMap(b);
        drawMap(shape);

    }
    //写一个方法调用
    //注意：方法不能嵌套，这个不能写到main方法方法中
    public static void drawMap(Shape2 shape){

        shape.draw();

    }

}
abstract class Shape2{

    Shape2(){

        draw();

    }
    public abstract void draw();

}


abstract class A extends Shape2{

    public void func(){

    }
    public abstract void testA();

}

class B2 extends A{

    @Override
    public void testA() {
        System.out.println("B2::testA()");
    }
    //↑↓，先重写父类的，还是父类的父类的，没有关系

    @Override
    public void draw() {
        System.out.println("B2::draw()");
    }
    public void testB(){
        System.out.println("B2::testB()");
    }

}













//**********//**********//**********//**********//**********
//验证重写父类方法之后，父类调用的是子类重写的方法
//并且，规避这种用到没有完成初始化的变量的写法
//保证代码的可读性
 class Test2 {

    public static void main2(String[] args) {

        D d = new D();
        //运行结果可知：先完成父类（B）的构造，调用的是子类D中重写是方法
        //此时，父类的花括号还没有走完，没有到D完成对成员变量的初始化
        //所以B调用D重写的方法，打印num的值为0
        //而B调用自己的func(),之前已经完成了对num的初始化
        //所以打印结果为2

    }

}
class B{

    B(){

        func();

    }

    public void func(){

        System.out.println("B.func()");

    }

}
class D extends B{

    private int num = 2;

    D(){

        func();


    }

    @Override//重写父类B 中的func方法（右键-generate-override…）
    public void func() {
        System.out.println("D.func()"+this.num);
    }
}


//**********//**********//**********//**********//**********
//打印图形
//用多态取代循环
 class Test1 {
    public static void main1(String[] args) {

        Shape[] shape = {new Circle(),new Rectangle(),new Triangle()};
        for(Shape shape2:shape){

            shape2.draw();

        }

    }
}
class Shape{

    public void draw(){
        System.out.println("draw a shape");
    }

}

class Rectangle extends Shape{

    public void draw(){

        System.out.println("draw a rectangle");

    }

}

class Triangle extends Shape{

    public void draw(){

        System.out.println("draw a triangle");

    }

}

class Circle extends Shape{

    public void draw(){

        System.out.println("draw a circle");

    }

}













